﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace Common.Paging
{
    public class Paging<T> : List<T>, IPaging
    {
        public Paging(IQueryable<T> source, int index, int pageSize)
        {
            this.TotalCount = source.Count();
            this.PageSize = pageSize;
            this.PageIndex = index;
            this.AddRange(source.Skip(index * pageSize).Take(pageSize).ToList());
        }

        public Paging(IEnumerable<T> source, int index, int pageSize)
        {
            this.TotalCount = source.Count();
            this.PageSize = pageSize;
            this.PageIndex = index;
            this.AddRange(source.Skip(index * pageSize).Take(pageSize).ToList());
        }

        public int TotalCount
        {
            get;
            set;
        }

        /// <summary>
        /// Die Anzahl an Seiten die zur Verfügung stehen.
        /// </summary>
        public double PageCount
        {
            get
            {
                if (TotalCount > 0)
                {
                    double size = (double)TotalCount / (double)PageSize;
                    return Math.Ceiling(size);    
                }

                return 0;
            }
        }

        public int PageIndex
        {
            get;
            set;
        }

        public int PageSize
        {
            get;
            set;
        }

        public bool IsPreviousPage
        {
            get
            {
                return (PageIndex > 0);
            }
        }

        public bool IsNextPage
        {
            get
            {
                return (PageIndex * PageSize) <= TotalCount;
            }
        }

        public bool HasNextPage
        {
            //Aufpassen, der PAgeIndex fängt bei 0 an zu zählen, damit aber HasNext richtig berechnet werden kann muss immer +1 auf den PageIndex bei der Berechnung hinzu addiert werden
            get { return ((PageIndex+1) * PageSize) < TotalCount; }
        }

        public bool HasPreviousPage
        {
            get { return (PageIndex > 0); }
        }
    }

}
